﻿using System;
using System.Collections.Generic;
using System.Linq;

using cit.CopyDetection.DatabaseAccess;
using cit.CopyDetection.DataObject;

namespace cit.CopyDetection.Preprocessing
{
    /// <summary>
    /// Đăng ký tài liệu
    /// </summary>
    public class Registerer
    {
        private TextSegmenter _segmenter;

        /// <summary>
        /// Tạo đối tượng đăng ký tài liệu
        /// </summary>
        public Registerer() 
        {
            _segmenter = new TextSegmenter();
        }

        /// <summary>
        /// Đăng ký tài liệu
        /// </summary>
        /// <param name="registeredDocument">Tài liệu đăng ký</param>
        public void RegisterDocument(Document registeredDocument)
        {
            //1. Phân tích tài liệu thành các đoạn văn bản bởi ký tự 'CR'
            string[] paragraphs = _segmenter.SegmentFileinParagraphs(ConfigReader.BasePath + registeredDocument.Location);

            bool isInserted = false;
            int paraNum = 0;
            for (int i = 0; i < paragraphs.Length; i++)
            {
                //2. - Đoạn văn bản được phân tích thành các thuật ngữ
                //   - Loại bỏ các từ rỗng nghĩa
                //   - Tất cả các đoạn văn bản ngắn được loại bỏ
                List<Term> terms = _segmenter.SegmentTextinTerms(paragraphs[i]);
                Paragraph paragraph = new Paragraph() { DocumentName = registeredDocument.Name };
                if (terms != null)
                {
                    int length = terms.Sum(t => t.GlobalFrequency);

                    if (!isInserted)
                    {
                        DocumentDataAccess.InsertDocument(registeredDocument);
                        isInserted = true;
                    }

                    paragraph.OrdinalNumber = ++paraNum;
                    paragraph.Length = length;
                    DocumentDataAccess.InsertParagraph(paragraph);

                    for (int j = 0; j < terms.Count; j++)
                        TermDataAccess.InsertPostingList(terms[j], paragraph);
                }
            }
        }

        /// <summary>
        /// Hủy đăng ký tài liệu
        /// </summary>
        /// <param name="document">Tài liệu hủy đăng ký</param>
        public void UnregisterDocument(Document document)
        {
            List<Paragraph> paragraphs = DocumentDataAccess.GetParagraphs(document);
            foreach (Paragraph paragraph in paragraphs)
            {
                TermDataAccess.RemoveTerms(paragraph);
                DocumentDataAccess.RemoveParagraph(paragraph);
            }
            DocumentDataAccess.RemoveDocument(document);
        }
    }
}
